#!/bin/bash

# 获取脚本所在的当前目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 获取脚本所在的父目录
PARENT_DIR="$(dirname "$SCRIPT_DIR")"

# 定义 Splint 检查选项的变量
SPLINT_OPTIONS=" -warnposixheaders -unrecog"

# 递归查找父目录下的所有头文件，并将它们的路径转换为 Splint 的 -I 选项
INCLUDE_OPTIONS=$(find "$PARENT_DIR" -type f -name "*.h" -exec dirname {} \; | sort -u | sed 's/^/-I/' | tr '\n' ' ')

# 递归查找父目录下的所有C语言文件，并使用 Splint 检查
find "$PARENT_DIR" -type f -name "*.c" -exec splint $INCLUDE_OPTIONS $SPLINT_OPTIONS {} \;
# 屏蔽说明：-preproc 消除未知头文件，-warnposixheaders POSIX 头文件给出警告，-unrecog 未识别的变量给出警告,-varuse定义却未使用变量

# splint忽略名单，下面来自ai仅供参考
# -unrecfun: 忽略未记录的函数声明。
# -unrecvar: 忽略未记录的变量声明。
# -varuse: 忽略未使用的变量声明。
# -compdef: 忽略在编译时定义的宏。
# -moddef: 忽略模块定义文件中的宏。
# -arguse: 忽略未使用的参数。
# -predbool: 忽略布尔类型的预测表达式。
# -shadow: 忽略变量阴影（即在相同作用域内重复使用变量名）。
# -nullpass: 忽略可能导致空指针解引用的代码。
# -nullret: 忽略可能导致空指针返回的代码。
# -igncmt: 忽略代码中的注释。
# -initallext: 忽略外部变量的初始值设定。
# -initnil: 忽略将变量初始化为 nil 的代码。
# -noeffect: 忽略没有实际效果的代码。
# -castfcn: 忽略函数指针的强制类型转换。
# -castint: 忽略整数类型的强制类型转换。
# -castunspec: 忽略未指定类型的强制类型转换。
# -castvoid: 忽略 void 类型的强制类型转换。
# -noeffectwarn: 忽略没有实际效果的代码警告。
# -nullpasswarn: 忽略可能导致空指针解引用的代码警告。
# -nullretwarn: 忽略可能导致空指针返回的代码警告。